package com.mssh.login.util;

import com.mssh.login.config.AuthConfig;
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import io.jsonwebtoken.io.Decoders;
import io.jsonwebtoken.io.Encoders;
import io.jsonwebtoken.security.Keys;
import javax.crypto.SecretKey;
import java.util.Date;

/**
 * Created with IntelliJ IDEA.
 *
 * @Author: 熳殊沙华
 * @Date: 2025/03/25/11:40
 * @Description:
 */
public class JwtUtil {

    // 生成 JWT
    public static String generateToken(String account, String salt) {
        byte[] keyBytes = Decoders.BASE64URL.decode(AuthConfig.getSecret()); // 密钥需先按 Base64URL 编码存储
        return Jwts.builder()
                .setSubject(account)
                .claim("salt", salt) // 存储盐值用于凭证匹配
                .setIssuedAt(new Date())
                .setExpiration(new Date(System.currentTimeMillis() + AuthConfig.getExpire() * 1000))
                .signWith(SignatureAlgorithm.HS512, Keys.hmacShaKeyFor(keyBytes))
                .compact();
    }

    // 解析 JWT
    public static Claims parseToken(String token) {
        byte[] keyBytes = Decoders.BASE64URL.decode(AuthConfig.getSecret()); // 密钥需先按 Base64URL 编码存储
        return Jwts.parser()
                .setSigningKey(Keys.hmacShaKeyFor(keyBytes))
                .parseClaimsJws(token)
                .getBody();
    }

    // 获取剩余有效期（秒）
    public static long getRemainingTime(String token) {
        byte[] keyBytes = Decoders.BASE64URL.decode(AuthConfig.getSecret()); // 密钥需先按 Base64URL 编码存储
        Date expiration = Jwts.parserBuilder()
                .setSigningKey(Keys.hmacShaKeyFor(keyBytes))
                .build()
                .parseClaimsJws(token)
                .getBody().getExpiration();
        return (expiration.getTime() - System.currentTimeMillis()) / 1000;
    }

    /**
     * 生成512位秘钥
     * @return
     */
    public String createSecretKey512(){
        // 生成一个256位的HS256安全密钥（32字节）
        SecretKey key = Keys.secretKeyFor(SignatureAlgorithm.HS512);
        // 将密钥转换为字符串（Base64编码，用于存储）
        String SECRET_KEY = Encoders.BASE64URL.encode(key.getEncoded());
        System.out.println("安全密钥: " + SECRET_KEY);
        return SECRET_KEY;
    }
}
